/**
 * request 网络请求工具
 * 更详细的 api 文档: https://github.com/umijs/umi-request
 */
import { extend } from 'umi-request';
import { Modal, notification } from 'antd';
import { getToken, setToken } from '@/utils/token';
// import {url_prefix} from "../../config/config";
const url_prefix = ''
const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
  402: '账号密码错误'
};
/**
 * 异常处理程序
 */

const errorHandler = error => {
  console.log(`%c 执行错误拦截`, 'color: gray');
  const { response, data = {} } = error; // 配合后端利用状态码+返回值的形式进行错误显示
  console.log(error);
  if (response && response.status) {
    console.log(data);
    const errorText = data.message || codeMessage[response.status] || response.statusText;
    const { status, url } = response;
    // 如果错误返回为422,需要提示特定错误
    if (response.status === 422) {
      const { errors } = data;
      console.log(errors);
      const keys = Object.keys(errors);
      // let description = '';
      let duration = 2;
      // keys.map((value) => {
      // duration += 2;
      // description += `${errors[value]};</br>`
      // })
      // notification.error({
      //   duration: duration,
      //   message: `参数错误`,
      //   description: description
      // });

      Modal.error({
        title: '参数错误',
        content: (
          <div>
            {keys.map(value => {
              return <p style={{ marginBottom: '3px' }}>{errors[value]}</p>;
            })}
          </div>
        ),
      });
    }
    else if(response.status === 401) {
      
    } 
    else if(response.status === 402){
      notification.error({
        description: '请求错误',
        message: '账号或密码错误',
      });
    }
     else {
      notification.error({
        message: `请求错误`,
        description: errorText,
      });
    }
  } else if (!response) {
    notification.error({
      description: '您的网络发生异常，无法连接服务器',
      message: '网络异常',
    });
  }

  // 修正为返回整个error，由实际发起请求的位置进行部分逻辑处理
  return error;
};
/**
 * 配置request请求时的默认参数
 */

const request = extend({
  errorHandler,
  // 默认错误处理
  credentials: 'include', // 默认请求是否带上cookie
  headers: {
    Accept: 'application/json',
  },
});

/**
 *  配置请求拦截器，用于注入token等验证信息
 */

// request interceptor, change url or options.
request.interceptors.request.use(async (url, options) => {
  console.log(`%c request to:${url}`, 'color:#bada55');
  let token = getToken();
  console.log('current token is :')
  console.log(token)
  // 检查token的过期时间，判断是否需要刷新token
  const currentTime = parseInt(new Date().getTime() / 1000);  
  if (token && token.access_token && !(currentTime < (token.expires_in + token.issueTime))) {
    console.log('need refresh token');
    // token 已经过期,需要执行刷新token的操作
    // 这里使用浏览器原生的fetch操作
    const authorizeUrl = url_prefix + '/api/auth/refresh';
    const refreshResponse = await fetch(authorizeUrl, {
      method: 'POST',
      headers: {
        Accept: 'application/json',
        Authorization: `${token.token_type} ${token.access_token}`,
        // token: `${token.token_type} ${token.access_token}`,
      },
    });
    const jsonData = await refreshResponse.json();
    if (refreshResponse.status === 200) {
      const issueTime = parseInt(new Date().getTime() / 1000);
      setToken({
        ...jsonData,
        issueTime,
      });
      token = getToken();
    }
  }
  if (token) {
    return {
      url: url_prefix + url,
      options: {
        ...options,
        headers: {
          ...options.headers,
          Authorization: `${token.token_type} ${token.access_token}`,
          injectHeader: 'true',
        },
      },
    };
  }
  // 修复在linux平台下无法发出请求的问题
  else {
    return {
      url: url_prefix + url,
      options,
    };
  }
});

/**
 *  返回拦截器 ， 用于当token失效时的重新请求,
 *  不应该在这里拦截
 */
// request.interceptors.response.use((response, options) => {
//   console.log(`%c response code from server: `, "color: black");
//     console.log(`%c 执行拦截请求`, "color: gray");
//     console.log(response);
//     console.log(options);
//   return response;
// });

export default request;
